#include "ClasseNoListaLC.h"
#include "ClasseListaLC.h"

//====================================
bool ListaCirc::Empty()
{
  if (inicio == NULL && final == NULL)
  return true;
  else
  return false;
}
//==========================
ListaCirc::ListaCirc()
{
  inicio = NULL;
  final = NULL;
  tamanho = 0;
}
//====================================
int ListaCirc::getTamanho()
{
  return tamanho;
}

//====================================
NoCirc * ListaCirc::getInicio()
{
     return inicio;
}
//====================================
NoCirc * ListaCirc::getFinal()
{
     return final;
}
//====================================
void ListaCirc::InsereInicio (String entrada)
{
 if (!(Empty()))
 {
  NoCirc * ponteiro = new NoCirc(entrada, inicio);
  final->setProximo(ponteiro);
  inicio = ponteiro;
 }
 else
 {
  NoCirc * ponteiro = new NoCirc(entrada, ponteiro);
  inicio = ponteiro;
  final = ponteiro;
 }
 tamanho ++;
}
//====================================
void ListaCirc::InsereFinal (String entrada)
{
 if (!(Empty()))
 {
  NoCirc * ponteiro = new NoCirc(entrada, inicio);
  final->setProximo(ponteiro);
  final = ponteiro;
 }
 else
 {
  NoCirc * ponteiro = new NoCirc(entrada, ponteiro);
  inicio = ponteiro;
  final = ponteiro;
 }
 tamanho ++;
}
//====================================
void ListaCirc::InsereMeio (String entrada, int local)
{
 if (!(Empty()))
 {
  NoCirc * aux1;
  NoCirc * aux2;
  int contador;
  if (local > 1)
  {
   if (local>tamanho)
   {
      InsereFinal(entrada);
   }
   else
   {
      aux1=getInicio();
      contador = 1;
      while (contador!=local)
      {
        aux2 = aux1;
        aux1 = aux1->getProximo();
        contador++;
      }
      NoCirc * ponteiro = new NoCirc(entrada, aux1);
      aux2->setProximo(ponteiro);
      tamanho ++;
   }
  }
  else
  {
   if (local == 1)
   {
    InsereInicio(entrada);
   }
  }
 }
 else if ((local == 1) || (local == 0))
 {
  InsereInicio(entrada);
 }
}
//====================================
void ListaCirc::RemoveInicio()
{
if (!(Empty()))
{
  NoCirc * deletado;
  deletado = inicio;
  if (inicio != final)
  {
    inicio = inicio->getProximo();
    final->setProximo(inicio);
  }
  else
  {
    inicio = NULL;
    final = NULL;
  }
  deletado->~NoCirc();
  deletado = NULL;
  tamanho --;
  }
}
//====================================
void ListaCirc::RemoveFinal()
{
if (!(Empty()))
{
  NoCirc * deletado;
  NoCirc * aux;
  deletado = inicio;
  if (inicio != final)
  {
    while (deletado != final)
    {
      aux = deletado;
      deletado = deletado->getProximo();
    }
    aux->setProximo(inicio);
    final = aux;
  }
  else
  {
    inicio = NULL;
    final = NULL;
  }
  deletado->~NoCirc();
  deletado = NULL;
  tamanho--;
}
}
//====================================
void ListaCirc::RemoveMeio(int local)
{
if (!(Empty()))
{
 NoCirc * aux1; // o que sera removido
 NoCirc * aux2; // o anterior ao removido
 NoCirc * aux3; // o posterior ao removido
 int contador;
 if (local > 1)
 {
   if (local==tamanho)
   {
      RemoveFinal();
   }
   else if (local<tamanho)
   {
      aux1=getInicio();
      contador = 1;
      while (contador!=local)
      {
        aux2 = aux1;
        aux1 = aux1->getProximo();
        contador++;
      }
      aux3 = aux1->getProximo();
      aux2->setProximo(aux3);
      aux1->~NoCirc();
      aux1=NULL;
      tamanho--;
   }
 }
 else if (local == 1 || local == 0)
 {
   RemoveInicio();
 }
}
}
//==========================
String ListaCirc::ConsultaInicio()
{
if (!(Empty()))
  return inicio->getPalavra();
else
  return "";
}
//==========================
String ListaCirc::ConsultaFinal()
{
if (!(Empty()))
  return final->getPalavra();
else
  return "";
}
//==========================
String ListaCirc::ConsultaMeio(int local)
{
 NoCirc * aux1;
 int contador;
 String resultado;
 resultado = "";
if (!(Empty()))
{
 if (local == 0 || local == 1)
 {
   resultado = ConsultaInicio();
 }
 else if (local==tamanho)
 {
   resultado = ConsultaFinal();
 }
 if (local<tamanho || local>1)
 {
   aux1 = inicio;
   contador = 1;
   while (contador!=local)
   {
     aux1 = aux1->getProximo();
     contador ++;
   }
   resultado = aux1->getPalavra();
 }
 }
 return (resultado);
}
